package es.javamyadmin.modelo;

import java.io.InputStream;
import java.util.Collection;

import org.apache.commons.beanutils.PropertyUtilsBean;

import es.javamyadmin.beans.UsuarioBean;
import es.javamyadmin.dao.DatabasesDAO;
import es.javamyadmin.dao.TablesDAO;
import es.javamyadmin.dao.TriggersDAO;
import es.javamyadmin.dao.UsuariosDAO;
import es.javamyadmin.pojo.Error;

/**
 * Clase estatica intermediaria entre las vistas y la base de datos
 * @author Emilio Javier Castillo Gonzalez
 * @author Hector Delgado Duran
 *
 */
public class ModelFacade {
		
	/**
	 * Metodo que muestra las bases de datos
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @return Collection
	 */
	public static Collection<Databases> getDatabase(String user, String pass, String host, String port){
		
		DatabasesDAO datadao = new DatabasesDAO();
		
		Collection<Databases> databases = datadao.leerDatabases(user, pass, host, port);
		
		return databases;
	}
	
	/**
	 * Metodo para exportar las bases de datos
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param bd
	 * @return boolean
	 */
	public static Boolean exportBD(String user, String pass, String host, String port, String bd) {
		
		DatabasesDAO datadao = new DatabasesDAO();
		
		return datadao.exportarBD(user, pass, host, port, bd);
	}
	
	/**
	 * Metodo que importa una base de datos
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param bd
	 * @param rutaArchivo
	 * @return Boolean
	 */
	public static Boolean importBD(String user, String pass, String host, String port, String bd, String rutaArchivo) {
		
		DatabasesDAO datadao = new DatabasesDAO();
		
		return datadao.importarBD(user, pass, host, port, bd, rutaArchivo);
	}
	
	/**
	 * Metodo que retorna las tablas de una base de datos
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param database
	 * @return Collection
	 */
	public static Collection<Tables> getTables(String user, String pass, String host, String port, String database){
		
		TablesDAO tabledao = new TablesDAO();
		
		Collection<Tables> tables = tabledao.leerTables(user, pass, host, port, database);
		
		return tables;
	}
	
	/**
	 * Metodo que obtiene el numero de filas de una tabla
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param database
	 * @param table
	 * @return Collection
	 */
	public static Collection<Tables> getNumFilasTables(String user, String pass, String host, String port, String database, String table){
		
		TablesDAO tabledao = new TablesDAO();
		
		Collection<Tables> tables = tabledao.leerNumFilasTables(user, pass, host, port, database, table);
		
		return tables;
	}
	
	/**
	 * Metodo que obtiene los usuarios de una base de datos
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param clausulaWhere
	 * @return
	 */
	public static Collection<Usuarios> getUsuarios(String user, String pass, String host, String port, String clausulaWhere){
		
		UsuariosDAO usuariosdao = new UsuariosDAO();
		
		Collection<Usuarios> usuarios = usuariosdao.leerUsuarios(user, pass, host, port, clausulaWhere);
		
		return usuarios;
	}
	
	/**
	 * Metodo para crear un usuario
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param bean
	 * @param path
	 * @return Error
	 */
	public static Error crearUsuario(String user, String pass, String host, String port, UsuarioBean bean, InputStream path) {
		
		Usuarios usuario = new Usuarios();
		UsuariosDAO udao = new UsuariosDAO();
		udao.setPath(path);
		try {
			PropertyUtilsBean pub = new PropertyUtilsBean();
			pub.copyProperties(usuario, bean);
		} catch(IllegalAccessException ex){
			ex.printStackTrace();
		} catch(java.lang.reflect.InvocationTargetException ex){
			ex.printStackTrace();
		} catch(NoSuchMethodException ex){
			ex.printStackTrace();
		}
		
		return udao.crearUsuario(user, pass, host, port, usuario);
	}
	
	/**
	 * Metodo para editar un usuario
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param bean
	 * @param path
	 * @return Error
	 */
	public static Error editarUsuario(String user, String pass, String host, String port, UsuarioBean bean, InputStream path) {
		
		Usuarios usuario = new Usuarios();
		UsuariosDAO udao = new UsuariosDAO();
		udao.setPath(path);
		try {
			PropertyUtilsBean pub = new PropertyUtilsBean();
			pub.copyProperties(usuario, bean);
		} catch(IllegalAccessException ex){
			ex.printStackTrace();
		} catch(java.lang.reflect.InvocationTargetException ex){
			ex.printStackTrace();
		} catch(NoSuchMethodException ex){
			ex.printStackTrace();
		}
		
		return udao.editarUsuario(user, pass, host, port, usuario);
	}
	
	/**
	 * Metodo para editar la contraseña de un usuario
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param usuarioMod
	 * @param hostMod
	 * @param nuevoPass
	 * @param path
	 * @return Error
	 */
	public static Error editarPasswordUsuario(String user, String pass, String host, String port, String usuarioMod, String hostMod, String nuevoPass, InputStream path) {
		
		UsuariosDAO udao = new UsuariosDAO();
		udao.setPath(path);
		return udao.editarPassUsuario(user, pass, host, port, usuarioMod, hostMod, nuevoPass);
	}
	
	/**
	 * Metodo que elimina un usuario
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param usuarioMod
	 * @param hostMod
	 * @param path
	 * @return Error
	 */
	public static Error eliminarUsuario(String user, String pass, String host, String port, String usuarioMod, String hostMod, InputStream path) {
		
		UsuariosDAO udao = new UsuariosDAO();
		udao.setPath(path);
		return udao.eliminarUsuario(user, pass, host, port, usuarioMod, hostMod);
	}
	
	/**
	 * Metodo que obtiene la descripcion de una tabla
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param database
	 * @param table
	 * @return Collection
	 */
	public static Collection<Tables> getDescribe(String user, String pass, String host, String port, String database, String table){
			
		TablesDAO tabledao = new TablesDAO();
			
		Collection<Tables> tables = tabledao.detalleTables(user, pass, host, port, database, table);
			
		return tables;
	}
		
	/**
	 * Metodo que obtiene el contenido de una tabla
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param database
	 * @param table
	 * @return Collection
	 */
	public static Collection<Tables> getSelect(String user, String pass, String host, String port, String database, String table){
			
		TablesDAO tabledao = new TablesDAO();
		
		Collection<Tables> select = tabledao.selecTables(user, pass, host, port, database, table);
		
		return select;
	}
	/**
	 * Metodo que obtiene el contenido de una tabla paginado
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param database
	 * @param table
	 * @param elementos
	 * @param pag
	 * @return Collection
	 */
	public static Collection<Tables> getSelectPag(String user, String pass, String host, String port, String database, String table, int elementos, int pag){
		
		TablesDAO tabledao = new TablesDAO();
		tabledao.setPag(pag);
		tabledao.setElementos(elementos);
		Collection<Tables> select = tabledao.selecTables(user, pass, host, port, database, table);
		
		return select;
	}
	
	/**
	 * Metodo que obtiene los triggers
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param database
	 * @return
	 */
	public static Collection<Triggers> getTriggers(String user, String pass, String host, String port, String database){
		
		TriggersDAO triDao = new TriggersDAO();
		
		Collection<Triggers> tri = triDao.getTriggers(user, pass, host, port, database);
		
		return tri;
	}
	
}
